package logica;

import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

import objetosGraficos.NaveEnemiga;
import objetosGraficos.NaveJugador;
import frame.FrameJuego;

/**
 * Clase creada para controlar los eventos del teclado del jugador.
 */
public class Teclado extends Thread implements KeyListener{
	
	// Atributos

	private int factor;
	private int x1 = 0;
	private int x2 = 0;
	private int y1 = 0;
	private int y2 = 0;

	private NaveJugador nave;
	private FrameJuego juego;

	// Constructor
	
	public Teclado(FrameJuego juego, NaveJugador nave){
		this.juego = juego;
		this.nave = nave;
		this.setFactor(nave.getFactor());
	}
	
	// Métodos

	
	/**
	 * Setea la nave del jugador.
	 * @param nave la nave que tendrá el jugador.
	 */
	public void setNave(NaveJugador nave) {
		this.nave = nave;
	}

	/**
	 * Setea el frame del juego.
	 * @param juego el frame del juego.
	 */
	public void setJuego(FrameJuego juego) {
		this.juego = juego;
	}
	
	/**
	 * Setea el factor de movimiento de la nave del jugador.
	 * @param factor el factor 
	 */
	public void setFactor (int factor){
		this.factor = factor;
	}
	
	/**
	 * Inicia el hilo del teclado
	 */
	public void run (){
		while(nave.getSalud() > 0){
			try{
				Thread.sleep(10); 
				this.nave.setLocation(this.nave.getX() + x1 + x2, this.nave.getY() + y1 + y2);
				rePos();
				this.juego.repaint();
			}catch (InterruptedException ex){				
			}
		}
	}
	
	// Eventos de key listener
	
	public void keyPressed(KeyEvent arg) {
		if (arg.getKeyCode() == KeyEvent.VK_F5){
			juego.reiniciar();
		}
	}
	
	public void keyReleased(KeyEvent arg0) {
		switch(arg0.getKeyChar()) {
			case ('w'): {
				y1 = 0;
				break;
			}
			case ('s'): {
				y2 = 0;
				break;
			}
			case ('a'): {
				x1 = 0;
				break;
			}
			case ('d'): {
				x2 = 0;
				break;
			}
		}
		
	}

	public void keyTyped(KeyEvent arg) {
		switch(arg.getKeyChar()) {
			case ('w'):  {
				y1 = -factor;
				break;
			}
			case ('s'): {
				y2 = factor;
				break;
			}
			case ('a'): {
				x1 = -factor;
				break;
			}
			case ('d'): {
				x2 = factor;
				break;
			}
			case ('j'): {
				this.juego.disparoJugador(this.nave.getLocation());
				break;
			} 
			case 'b':{
				if(nave.getBombas() > 0){
					this.nave.usarBomba();
					new BombaThread(juego).start();
				}
				break;
			}
			case 'i':{
				juego.cambiarInterfaz();
				break;
			}
		}			
	}

	/**
	 * Reposiciona la nave del jugador para controlar que no se salga de los límites de la pantalla.
	 */
	private void rePos (){
		JPanel panelJuego = juego.getPanelNaves();
		if (nave.getY() < 0)
			nave.setLocation(nave.getX(), 0);
		else if (nave.getY() + nave.getHeight() > panelJuego.getHeight() - 28)
			nave.setLocation(nave.getX(),panelJuego.getHeight() - nave.getHeight() - 28);
		
		if (nave.getX() < 0)
			nave.setLocation(0, nave.getY());
		else if (nave.getX() + nave.getWidth() > panelJuego.getWidth() - 6)
			nave.setLocation(panelJuego.getWidth() - nave.getWidth() - 6, nave.getY());
		
	}
	
}

